#include "buffermap.h"
#include "../include.h"

/*
// Se trouve déja dans include.c
int taille_fichier_fd(FILE * fd){
  fseek(fd, 0, SEEK_END); // Mettre le pointeur à la fin du fichier
  int size = ftell(fd); // Récupérer la valeur du pointeur
  fseek(fd, 0, SEEK_SET); // Remettre le pointeur au début du fichier
  return size;
}
*/



/********************************** Static functions *****************************************/

void conversion_binaire(long long val, char * buffer, int buffer_size){
   int i = 0;
   long long dec = val;
   while (dec != 0){
     if (dec%2 == 0){
       buffer[buffer_size-i-1] = '0';
       dec = dec/2;
       i++;
     }
     else {
       buffer[buffer_size-i-1] = '1';
       dec = dec/2;
       i++;
     }
   }
   buffer[buffer_size] = '\0';
}

buffermap create_buffermap(long long decimal, unsigned int file_size){ 
	//EntreeTable fichier = trouver_fichier(table, key);
	buffermap bm;
	bm.size = ceil(((double)file_size / PIECE_SIZE));
	bm.buffer = malloc(bm.size * sizeof(char)+1);
	int i;
	for (i=0; i< bm.size; i++)
	  bm.buffer[i] = '0';
	conversion_binaire(decimal, bm.buffer, bm.size);
	return bm;
} 

long long buffmap_to_int(buffermap bm){
  long long res = 0;
  long long i;
  for(i=0 ; i<bm.size ; i++){
    if (bm.buffer[i] == '1')
      res += pow(2,i);
  }
  return res;
}


/*
int taille_fichier(char * file_name){
  FILE * fd = fopen(file_name, "rb");
  fseek(fd, 0, SEEK_END); // Mettre le pointeur à la fin du fichier
  int size = ftell(fd); // Récupérer la valeur du pointeur
  fseek(fd, 0, SEEK_SET); // Remettre le pointeur au début du fichier
  fclose(fd);
  return size;
}
*/


/*
* Fonction qui prend en paramètre un fichier et une structure buffermap
* Initialise le buffermap avec des '0' après l'allocation mémoire = nombre de pièces du fichier
*/
void init_buffermap(buffermap bm, char * filename){
	//FILE * pfile = fopen(filename, "r");

	bm.size = ceil( ((float)taille_fichier(filename)) / PIECE_SIZE );
	bm.buffer = malloc(bm.size * sizeof(char));
	int i;
	for (i=0; i< bm.size; i++)
		bm.buffer[i] = '0';
}

/*
* Fonction qui prend en paramètre une structure buffermap
* Désalloue l'espace mémoire occupé par le buffermap alloué dynamiquement 
*/
void destroy_buffermap(buffermap* buffer){
	free(buffer);
	//free(buffer);
}

/*
* Fonction qui prend en paramètre un entier et une structure buffermap
* Met à jour le buffermap en mentionnant l'existence de la pièce numéro piece_number 
*/
void MAJ__buffermap(buffermap bm, int piece_number){
	bm.buffer[piece_number] = '1';
}

/*
* Fonction de déboguage qui prend en paramètre une structure buffermap
* Affiche le buffermap dans la sortie standard
*/
void print_buffermap(buffermap bm){
    printf("\n----BUFFERMAP----\n");
	int i;
	for (i=0; i< bm.size; i++)
		printf("__");
	printf("_\n");
	for (i=0; i< bm.size; i++)
		printf("|%c", bm.buffer[i]);
	printf("|\n");
    //printf("\n----END DEBUG---- TAILLE : %d\n", bm.size);
    //printf("\n----END DEBUG---- NBRELEMENTS : %d\n", i);
}



	
